package com.ebao.dao.base;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;

/**
 * @author snow
 * @param <T>
 */
public interface IBaseJpaDao<T> {

	/**
	 * 持久化一个对象，该对象类型为T
	 */
	public void save(final T newInstance);

	/**
	 * 更新一个对象，主要用于更新一个在persistenceContext之外的一个对象
	 * @param transientObject 需要更新的对象，该对象不需要在persistenceContext中
	 */
	public void update(final T transientObject);
	
	/**
	 * 删除一个对象
	 * 对象必须是session中的对象或含id属性的transient对象.
	 */
	public void delete(final T entity);
	
	/**
	 * 删除多个对象
	 */
	public void delete(final T[] entitys);
	
	/**
	 * 删除多个对象
	 */
	public void delete(final Collection<T> entitys);
	
	/**
	 * 根据对象id删除一个对象，该对象类型为T
	 */
	public void deleteById(final Serializable id);
	
	/**
	 * 根据Id查找一个类型为T的对象
	 */
	public T getById(final Serializable id);
	
	/**
	 * 根据jpql查询T对象
	 * @param jpql
	 * @param objs
	 * @return
	 */
	public T getByJpql(final String jpql, final Object... objs);
	
	/**
	 * 根据一个查询条件及其参数，还有开始查找的位置和查找的个数来查找类型为T的对象
	 * 
	 * @param queryStr	查询的条件，使用位置参数，对象名统一为obj，查询条件从where后开始
	 * 					比如：obj.name = ?1 and obj.properties = ?2
	 * @param params 	查询条件中的参数的值。使用Object数组，要求顺序和查询条件中的参数位置一致
	 * @param begin		开始查询的位置
	 * @param max		需要查询的对象的个数
	 * @return 			一个该类型对象的List对象，如果没有查到任何数据，返回一个空的List对象
	 */
	public List<T> queryByPageAfterWhere(final String queryStr, final int begin, final int max, final Object... objs);
	
	/**
	 * 根据一个查询条件及其参数，还有开始查找的位置和查找的个数来查找任意类型的对象
	 * 
	 * @param queryStr	完整的查询语句，使用位置参数
	 * 					比如：select user from User user where user.name = ?1 and user.properties = ?2
	 * @param params	查询条件中的参数的值。使用Object数组，要求顺序和查询条件中的参数位置一致
	 * @param begin		开始查询的位置
	 * @param max		需要查询的对象的个数
	 * @return 			一个任意对象的List对象，如果没有查到任何数据，返回一个空的List对象
	 */
	@SuppressWarnings("rawtypes")
	public List query(final String jpql, final int begin, final int max, final Object... objs);
	
	/**
	 * 通过jpql得到满足条件的对象的数量
	 * 
	 * @param jpql
	 * @param objs
	 * @return
	 */
	public int getCount(final String jpql, final Object... objs);
	
	/**
	 * 根据jpql语句执行批量数据更新等操作
	 * 
	 * @param jpql需要执行jpql语句
	 * @param objs语句中附带的参数
	 * @return
	 */
	public int batchUpdate(final String jpql, final Object... objs);
	
	/**
	 * 清除一级缓存的数据
	 */
	public void clear();
	
	/**
	 * 置为游离状态
	 */
	public void detach(T t);
	
	/**
	 * flush()
	 */
	public void flush();
	
	/**
	 * 执行SQL语句查询记录数
	 */
	public int executeNativeGetCount(final String sqlString, final Object... objs);
	
	/**
	 * 执行SQL语句更新
	 */
	public int executeNativeUpdate(final String sqlString, final Object... objs);
	
	/**
	 * 执行SQL语句查询T对象
	 */
	public T executeNativeQueryOne(final String sqlString, final Object... objs);
	
	/**
	 * 执行SQL语句查询
	 */
	@SuppressWarnings("rawtypes")
	public List executeNativeQuery(final String sqlString, final Object... objs);
	
	/**
	 * 执行SQL语句分页查询
	 */
	@SuppressWarnings("rawtypes")
	public List executeNativeQuery(final String sqlString, final int begin, final int max, final Object... objs);
	
}
